#pragma once
#include <stdint.h>
#include <stdbool.h>

//SSD1306_LCDHEIGHT 默认为32
#ifndef SSD1306_LCDHEIGHT
#define SSD1306_LCDHEIGHT 32
#endif

#define SSD1306_ROWS (SSD1306_LCDHEIGHT / 8)
#define SSD1306_COLS 128

enum ssd1306_commands {
    SSD1306_SETLOWCOLUMN = 0x00,
    SSD1306_SETHIGHCOLUMN = 0x10,
    SSD1306_MEMORYMODE = 0x20, //设置内存模式
    SSD1306_COLUMNADDR = 0x21, //设置列地址
    SSD1306_PAGEADDR = 0x22,   //设置页地址
    SSD1306_SETSTARTLINE = 0x40,

    SSD1306_SETCONTRAST = 0x81, //对比度调解，256级
    SSD1306_CHARGEPUMP = 0x8D,
    SSD1306_SEGREMAP_RESET = 0xA0,  //设置段复用，列地址0映射到SEG0（复位值）
    SSD1306_SEGREMAP_INVERSE = 0xA1,//设置段复用，列地址127映射到SEG0（复位值）
    SSD1306_DISPLAYALLON_RESUME = 0xA4,//恢复RAM内容显示（复位）
    SSD1306_DISPLAYALLON = 0xA5, //忽略RAM内容，全屏显示开
    SSD1306_NORMALDISPLAY = 0xA6, //正常显示
    SSD1306_INVERTDISPLAY = 0xA7, //反显
    SSD1306_SETMULTIPLEX = 0xA8, //设置复用比
    SSD1306_DISPLAYOFF = 0xAE, //显示关闭
    SSD1306_DISPLAYON = 0xAF,  //显示开启在正常模式
    SSD1306_PAGESTARTADDR = 0xB0,
    SSD1306_COMSCANINC = 0xC0, //设置COM输出扫描方向：正常方向
    SSD1306_COMSCANDEC = 0xC8, //设置COM输出扫描方向：映射模式

    SSD1306_SETDISPLAYOFFSET = 0xD3, //设置显示偏移量 0-63
    SSD1306_SETDISPLAYCLOCKDIV = 0xD5, //设置显示时钟分频器、振荡器频率
    SSD1306_SETPRECHARGE = 0xD9, //设置预充电周期
    SSD1306_SETCOMPINS = 0xDA, //设置COM 引脚硬件配置 
    SSD1306_SETVCOMDETECT = 0xDB, //设置VCOM取消水平等级

    SSD1306_RIGHT_HORIZONTAL_SCROLL = 0x26,
    SSD1306_LEFT_HORIZONTAL_SCROLL = 0x27,
    SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29,
    SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A,
    SSD1306_DEACTIVATE_SCROLL = 0x2E,
    SSD1306_ACTIVATE_SCROLL = 0x2F,
    SSD1306_SET_VERTICAL_SCROLL_AREA = 0xA3,
};

extern uint8_t ssd1306_display_buffer[];
extern bool ssd1306_buff_dirty[SSD1306_ROWS];
void ssd1306_show_buff(uint8_t row, uint8_t col_start, uint8_t len);
void ssd1306_show_dirty_block();

#ifndef SSD1306_INIT_BUFF
#define SSD1306_INIT_BUFF {\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0x7c, 0x3f, 0x1f, 0x0c, 0x04, 0x80, 0xc0, 0xc0,\
    0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xe0, 0xf0, 0xf8,\
    0x7c, 0x3e, 0x1f, 0x0f, 0x07, 0x83, 0xc1, 0xe0, 0xf0, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x0f, 0x07,\
    0x8f, 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x02, 0x03, 0xfe,\
    0xfe, 0xfe, 0xfe, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xf0, 0x30,\
    0x10, 0xf0, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x30, 0xf0, 0xfc, 0xfe, 0xfe, 0x30, 0x30, 0x20, 0x02,\
    0x03, 0xfe, 0xfe, 0xfe, 0xfe, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xf0,\
    0x10, 0x10, 0xf0, 0xf0, 0xf0, 0xe0, 0x00, 0x00, 0x01, 0x03, 0xff, 0xff, 0xff, 0xff, 0x20, 0x30,\
    0x70, 0xf0, 0xf0, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f,\
    0x7e, 0xfc, 0xf8, 0xf0, 0xe0, 0xc1, 0x83, 0x07, 0x0f, 0x1f, 0x3e, 0x7c, 0xfc, 0xfc, 0xfe, 0xff,\
    0x8f, 0x87, 0x03, 0x01, 0x01, 0x01, 0x03, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x7f,\
    0x7f, 0x7f, 0x7f, 0x60, 0x40, 0x40, 0x40, 0x78, 0x78, 0x00, 0x07, 0x3f, 0x7f, 0x7f, 0x7f, 0xc0,\
    0xc0, 0xf0, 0x7f, 0x7f, 0x3f, 0x1f, 0x00, 0x00, 0x3f, 0x7f, 0xff, 0xff, 0xf0, 0x60, 0x60, 0x40,\
    0x40, 0x7f, 0x7f, 0x7f, 0x7f, 0x60, 0x40, 0x40, 0x40, 0x78, 0x78, 0x00, 0x10, 0x7c, 0xfc, 0xfe,\
    0xe6, 0x42, 0x7f, 0x7f, 0xff, 0xff, 0x60, 0x40, 0x00, 0xc0, 0x7f, 0xff, 0xff, 0x7f, 0x60, 0xe0,\
    0xf0, 0xff, 0x7f, 0x7f, 0x1f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7e, 0xfc, 0xf8, 0x70, 0x20, 0x01, 0x03, 0x07,\
    0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\
}
#endif
